{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 读入数据\n",
    "df = pd.read_csv(\"FE_pima-indians-diabetes-FE.csv\")\n",
    "\n",
    "# 数据分离\n",
    "y = df['Target']\n",
    "X = df.drop('Target', axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 稀疏数据-start\n",
    "# 若数据集特征多为0,可将原始数据变为稀疏数据,可减少训练时间\n",
    "# 查看一个学习期是否支持稀疏数据,可以看其fit函数是否支持:X{array-like, aparse matrix}\n",
    "# 可自行使用timeit比较稠密数据和稀疏数据的训练时间\n",
    "# from scipy.sparse import csr_matrix\n",
    "# X_train = csr_matrix(X)\n",
    "# 本数据即特征为0不算多,不使用稀疏\n",
    "# 稀疏数据-end"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each flod is: [-0.75974026 -0.74025974 -0.78571429 -0.79738562 -0.77124183]\n",
      "cv logloss is: -0.770868347339\n"
     ]
    }
   ],
   "source": [
    "# 交叉验证用于评估模型性能和进行参数调优(模型选择)\n",
    "# 分类任务中交叉验证缺省是采用StratifiedKFold\n",
    "# accuracy neg_log_loss\n",
    "from sklearn.model_selection import cross_val_score\n",
    "loss = cross_val_score(lr, X, y, cv=5, scoring='accuracy')\n",
    "print('logloss of each flod is:', -loss)\n",
    "print('cv logloss is:', -loss.mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy  score: 0.774739583333\n",
      "accuracy  params: {'C': 0.1, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "# Logistic Regression + GridSearchCV\n",
    "# logistic回归的需要调整超参数有:C(正则系数,一般在log域(取log后的值), 均匀设置候选参数)和正则函数penalty(L2/L1)\n",
    "# 目标函数为J = C*sum(logloss(f(xi), yi)) + penalty\n",
    "#　在sklearn框架下，不同学习期的参数调整步骤相同：\n",
    "# 1. 设置参数搜索范围\n",
    "# 2. 生成学习器示例（参数设置）\n",
    "# 3. 生成GridSearchCV的示例(参数设置)\n",
    "# 4. 调用GrdSearchCV的fit方法\n",
    "\n",
    "X_train = X.values\n",
    "y_train = y.values\n",
    "lr = LogisticRegression()\n",
    "penaltys = ['l1', 'l2']\n",
    "Cs = [0.01, 0.1, 1, 10, 100]\n",
    "tuned_parammeters = dict(penalty=penaltys, C = Cs)\n",
    "\n",
    "lr_penalty = LogisticRegression(solver='liblinear')\n",
    "\n",
    "#scorings = ['accuracy','neg_log_loss']\n",
    "\n",
    "\n",
    "grid = GridSearchCV(lr_penalty, tuned_parammeters, cv=5, scoring='accuracy', return_train_score = True)\n",
    "grid.fit(X_train, y_train)\n",
    "\n",
    "print('accuracy', ' score:', abs(grid.best_score_))\n",
    "print('accuracy', ' params:', grid.best_params_)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fa972d4f898>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = grid.cv_results_['mean_test_score']\n",
    "test_stds = grid.cv_results_['std_test_score']\n",
    "train_means = grid.cv_results_['mean_train_score']\n",
    "train_stds = grid.cv_results_['std_train_score']\n",
    "\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores  = np.array(test_means).reshape(n_Cs, number_penaltys)\n",
    "train_scores   = np.array(train_means).reshape(n_Cs, number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs, number_penaltys)\n",
    "train_stds  = np.array(train_stds).reshape(n_Cs, number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #plt.errorbar(x_axis, test_scores[:,i], yerr=test_stds[:,i], label = penaltys[i]+' Test')\n",
    "    #plt.errorbar(x_axis, train_scores[:,i], yerr=train_stds[:,i], label = penaltys[i]+' Train')\n",
    "    plt.errorbar(x_axis, test_scores[:,i], label = penaltys[i]+' Test')\n",
    "    plt.errorbar(x_axis, train_scores[:,i], label = penaltys[i]+' Train')\n",
    "\n",
    "plt.legend()\n",
    "plt.xlabel('log(C)')\n",
    "plt.ylabel('accuracy')\n",
    "plt.savefig('logisticGridSearchCV_accuracy_C.png')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "上图给出了L1正则和L2正常在正则参数C对象的模型,在训练集上的 accuracy.\n",
    "可以看出在训练集上使用l2正则,正则参数C在0.1处(log(C)=-1)达到函数达到最大值,此时模型最好"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "neg_log_loss  score: 0.476026635474\n",
      "neg_log_loss  params: {'C': 1, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "grid = GridSearchCV(lr_penalty, tuned_parammeters, cv=5, scoring='neg_log_loss', return_train_score = True)\n",
    "grid.fit(X_train, y_train)\n",
    "\n",
    "print('neg_log_loss', ' score:', abs(grid.best_score_))\n",
    "print('neg_log_loss', ' params:', grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fa9727f7a20>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = grid.cv_results_['mean_test_score']\n",
    "test_stds = grid.cv_results_['std_test_score']\n",
    "train_means = grid.cv_results_['mean_train_score']\n",
    "train_stds = grid.cv_results_['std_train_score']\n",
    "\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores  = np.array(test_means).reshape(n_Cs, number_penaltys)\n",
    "train_scores   = np.array(train_means).reshape(n_Cs, number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs, number_penaltys)\n",
    "train_stds  = np.array(train_stds).reshape(n_Cs, number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #plt.errorbar(x_axis, test_scores[:,i], yerr=test_stds[:,i], label = penaltys[i]+' Test')\n",
    "    #plt.errorbar(x_axis, train_scores[:,i], yerr=train_stds[:,i], label = penaltys[i]+' Train')\n",
    "    plt.errorbar(x_axis, -test_scores[:,i], label = penaltys[i]+' Test')\n",
    "    plt.errorbar(x_axis, -train_scores[:,i], label = penaltys[i]+' Train')\n",
    "\n",
    "plt.legend()\n",
    "plt.xlabel('log(C)')\n",
    "plt.ylabel('logloss')\n",
    "plt.savefig('logisticGridSearchCV_C.png')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上图给出了L1正则和L2正常在正则参数C对象的模型,在训练集上的neglogloss.\n",
    "可以看出在训练集上C越大越好(正则越小越好),正则参数C在1处(log(C)=0)达到函数达到收敛,此时模型最好\n",
    "当C=1处,各训练集上的得分相差不大"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'cPickle'",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m\u001b[0m",
      "\u001b[0;31mModuleNotFoundError\u001b[0mTraceback (most recent call last)",
      "\u001b[0;32m<ipython-input-57-ebbe9e56befd>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mimport\u001b[0m \u001b[0mcPickle\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0mcPickle\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdump\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgrid\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbest_estimator_\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'l1_org.pkl'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'wb'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
      "\u001b[0;31mModuleNotFoundError\u001b[0m: No module named 'cPickle'"
     ]
    }
   ],
   "source": [
    "#import cPickle\n",
    "\n",
    "#cPickle.dump(grid.best_estimator_, open('l1_org.pkl', 'wb'))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
